package cn.com.nes.site.service.product.impl;

import cn.com.nes.common.util.CopyUtils;
import cn.com.nes.mybatis.agent.ope.entity.IsSblxNameplateConfig;
import cn.com.nes.mybatis.agent.ope.mapper.IsSblxNameplateConfigMapper;
import cn.com.nes.site.entity.PageData;
import cn.com.nes.site.entity.dto.product.IsSblxNameplateConfigDTO;
import cn.com.nes.site.entity.vo.product.IsSblxNameplateConfigVO;
import cn.com.nes.site.service.product.GGoodsService;
import cn.com.nes.site.service.product.IsSblxNameplateConfigService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;

import static cn.com.nes.site.service.product.impl.GGoodsServiceImpl.GOODS_FIELDS_ENERGY_TYPE;

/**
 * 设备铭牌配置服务实现类
 *
 * @Author: ShenWei
 * @Date: 2024/04/02/10:33
 */
@Service
public class IsSblxNameplateConfigServiceImpl extends ServiceImpl<IsSblxNameplateConfigMapper, IsSblxNameplateConfig> implements IsSblxNameplateConfigService {
    @Resource
    IsSblxNameplateConfigMapper isSblxNameplateConfigMapper;
    @Resource
    GGoodsService gGoodsService;

    @Override
    @Transactional(rollbackFor = Exception.class)
    public PageData saveNameplateList(IsSblxNameplateConfigVO vo) {
        String deviceModelId = vo.getDeviceModelId();

        List<IsSblxNameplateConfigVO> nameplateList = vo.getNameplateList();
        if (CollectionUtils.isEmpty(nameplateList)){
            return PageData.ok("保存成功");
        }
        // 校验重复字段
        for (IsSblxNameplateConfigVO configVO : nameplateList) {
            String sblxField = configVO.getSblxField();
            long count = nameplateList.stream().filter(n -> sblxField.equals(n.getSblxField())).count();
            if (count > 1){
                return PageData.error("保存失败,字段【" + sblxField + "】重复");
            }
        }

        // 删除以前所有的
        // 物理删除
        isSblxNameplateConfigMapper.delNameplateByDicId(deviceModelId);
        // 保存当前所有的
        List<IsSblxNameplateConfig> configs = CopyUtils.copyList(nameplateList, IsSblxNameplateConfig.class);
        // 添加
        for (IsSblxNameplateConfig config : configs) {
            config.setSblxDicId(deviceModelId);
            config.setSfsc(false);
            config.setCjsj(vo.getOperateDate());
            config.setGmtCreateId(vo.getOperateUserId());
            this.save(config);
        }
        return PageData.ok("保存成功");
    }

    @Override
    public PageData saveNameplate(IsSblxNameplateConfigVO vo) {
        // 校验字段配置是否重复
        if (checkFieldConfig(vo)){
            return PageData.error("保存失败,当前字段已被占用");
        }
        // 组装参数
        IsSblxNameplateConfig isSblxNameplateConfig = new IsSblxNameplateConfig();
        BeanUtils.copyProperties(vo,isSblxNameplateConfig);

        Long userId = Long.valueOf(vo.getUserInfo().getId());
        Date now = new Date();
        Long id = isSblxNameplateConfig.getId();

        if (Objects.isNull(id)){
            isSblxNameplateConfig.setSfsc(false);
            isSblxNameplateConfig.setCjsj(now);
            isSblxNameplateConfig.setGmtCreateId(userId);
        } else {
            if (!checkIsUsed(id)){
                return PageData.error("修改失败,当前铭牌正在使用中!");
            }
            isSblxNameplateConfig.setXgsj(now);
            isSblxNameplateConfig.setGmtModifiedId(userId);
        }

        this.saveOrUpdate(isSblxNameplateConfig);
        return PageData.ok("保存成功");
    }

    @Override
    public PageData getNameplateInfo(IsSblxNameplateConfigVO vo) {
        // 组装查询参数
        LambdaQueryWrapper<IsSblxNameplateConfig> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(IsSblxNameplateConfig::getSfsc,false);
        wrapper.eq(IsSblxNameplateConfig::getSblxDicId,vo.getDeviceModelId());
        wrapper.orderByDesc(IsSblxNameplateConfig::getId);
        List<IsSblxNameplateConfig> isSblxNameplateConfigs = this.list(wrapper);
        // 结果集泛型转换
        Map<String, Object> map = CopyUtils.listToMap("nameplateInfo", isSblxNameplateConfigs, IsSblxNameplateConfigDTO.class);
        // map.put("canUpdate",gGoodsService.checkCanUpdate(GOODS_FIELDS_ENERGY_TYPE, vo.getDeviceModelId()));
        return PageData.ok(map);
    }

    @Override
    public PageData delNameplate(IsSblxNameplateConfigVO vo) {
        if (!checkIsUsed(vo.getId())){
            return PageData.error("删除失败,当前铭牌正在使用中!");
        }

        Long userId = Long.valueOf(vo.getUserInfo().getId());
        Date now = new Date();

        IsSblxNameplateConfig isSblxNameplateConfig = new IsSblxNameplateConfig();
        isSblxNameplateConfig.setId(vo.getId());
        isSblxNameplateConfig.setSfsc(true);    // 删除
        isSblxNameplateConfig.setXgsj(now);
        isSblxNameplateConfig.setGmtModifiedId(userId);

        this.saveOrUpdate(isSblxNameplateConfig);

        return PageData.ok("删除成功");
    }

    // 检查当前配置的铭牌是否正在使用
    // 耦合有点高,铭牌表 -> 产品表
    // 或者可以在产品使用该铭牌时更新铭牌表状态,待定
    private Boolean checkIsUsed(Long id){
        LambdaQueryWrapper<IsSblxNameplateConfig> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(IsSblxNameplateConfig::getId, id);

        IsSblxNameplateConfig isSblxNameplateConfig = this.getOne(wrapper);
        String sblxDicId = isSblxNameplateConfig.getSblxDicId();

        return gGoodsService.checkCanUpdate(GOODS_FIELDS_ENERGY_TYPE, sblxDicId);
    }

    /**
     * 校验字段配置是否重复
     *
     * @param vo
     * @return  true-不能保存  false-可以保存
     */
    public Boolean checkFieldConfig(IsSblxNameplateConfigVO vo){
        Long id = vo.getId();
        String sblxDicId = vo.getDeviceModelId();
        String sblxField = vo.getSblxField();

        // 查询字段是否被占用
        LambdaQueryWrapper<IsSblxNameplateConfig> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(IsSblxNameplateConfig::getSfsc,false);
        wrapper.eq(IsSblxNameplateConfig::getSblxDicId,sblxDicId);
        wrapper.eq(IsSblxNameplateConfig::getSblxField,sblxField);
        Integer count = this.baseMapper.selectCount(wrapper);

        // 没被占用
        if (0 == count){
            return false;
        }

        // 已被占用
        // 如果是新增
        if (Objects.isNull(id)){
            return true;
        }
        // 如果是修改
        IsSblxNameplateConfig isSblxNameplateConfig = this.getById(id);
        String oldField = isSblxNameplateConfig.getSblxField();
        if (oldField.equals(sblxField)){
            return false;
        }
        return true;
    }
}
